package gui;
import gui.SimuMode;
import java.util.LinkedList;
import java.util.concurrent.BlockingQueue;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import model.BoxOffice;
import model.BoxOfficeState;
import model.Client;

import kontroler.msg;

/**
 * Glowne okno w ktorym dokonuje sie symulacja.
 * Za pomoca kolejki wysyla wiadomosci do kontrolera.
 * Zawiera trzy glowne panele: górny (z informacjami dla uzytkownika), srodkowy (symulacja) i 

dolny (panel uzytkownika z przyciskami).
 */

public class View{
	
	private static final long serialVersionUID = 1L;
	/** Queue for sending messages from view to controller. */
    private static BlockingQueue<model.msg> queue = null;
	/** Musi być jedynym obiektem klasy View */
    private static View view = null;
    /***/
	private JFrame simulFrame;
    

	/**
	 * Tworzy instancję klasy View.
	 * @param queue Kolejka blokująca - bufor ktory przechowuje wiadomosci z widoku do 

kontrolera.
	 * @return Instancja (jedyna) klasy View. 
	 */
	public static View init(BlockingQueue<model.msg> blockingQueue)
	{
		if(view == null)
		{    
			queue = blockingQueue;
			view = new View();
		}
		return view;
	}
	  
	 /**
	  * Wyświetla informacje dla uzytkownika na górnym panelu.
	  * @param message Wiadomość do wyswietlenia.
	  */
	 public void addMessage(final String message)
	 	{
		 SwingUtilities.invokeLater(new Runnable()
	        {
	            public void run()
	            {
	            	((SimuFrame)simulFrame).displayMessage(message);
	            }
	        });
	 	}
	 
	 /**
	  * Zmienia widok okna supermarketu na podstawie aktualnego stanu symulacji.
	  * @param model Informacje o modelu gry.
	  */
	 public void change(final model.msg simulInfo)
	 {
		 SwingUtilities.invokeLater(new Runnable()
	        {
	            public void run()
	            {
	            	((SimuFrame)simulFrame).change(simulInfo);
	            }
	        });
	 }
	 
	 /**
	  * Ustawia status panelu uzytkownika reprezentujacego wybor przyciskow dla uzytkownika.
	  * Aktywuje i dezaktywuje odpowiednie przyciski.
	  */
	 public void setUserPanel(final SimuMode mode){
		 
		 SwingUtilities.invokeLater(new Runnable()
	        {
	            public void run()
	            {
	            	((SimuFrame)simulFrame).setUserPanel(mode);
	            }
	        });
	 }
 
	 /** 
	 * Zamyka ramkę.
	 */
	    public void dispose()
	    {
	        ((SimuFrame)simulFrame).close();
	    }

	  /** 
	   * Konstruktor View.
	   * Prywatny - ponieważ może być tylko jedno wystąpienie klasy.
	   */
	    private View()
	    {
	    	this. simulFrame = SimuFrame.init(queue);
	        
	    }
	    
	    
}

